home *** CD-ROM | disk | FTP | other *** search
- type nimage = Array[0..65534] of Byte;
-
- Var
- i,j,coul1,coul2 : integer;
- map : ^nimage;
- c : pointer;
- f : file;
- nx,ny,coul : integer;
- lx,ly,cx,cy,di : integer;
-
-
- Function MouseGetPosX: Word; ASSEMBLER;
- ASM
- MOV AX,0003H
- INT 33H
- MOV AX,CX
- END;
-
- Function MouseGetPosY :Word; ASSEMBLER;
- ASM
- MOV AX,0003H
- INT 33H
- MOV AX,DX
- END;
-
- Function MouseLeft : BOOLEAN; ASSEMBLER;
- ASM
- MOV AX,0003H
- INT 33H
- AND BX,1
- MOV AX,BX
- END;
-
- Begin
- { Initialisation des deux pointeurs : source et destination }
- c:=ptr($a000,0);
- New(map);
-
- { Passage en mode graphique, et activation de la palette}
- asm
- mov ax,13h
- int 10h
- end;
- port[$3C8]:=0;
- for i:=0 to 767 do port[$3C9]:=i div 12;
-
- {Lecture du fichier, au format brut 320*200*256 niveaux de gris}
- assign(f,'bump.img');
- reset(f,1);
- blockread(f,map^,64000);
- close(f);
-
-
- repeat
- {On recupere dans (cx,cy) les coordonnées du centre de lumière}
- cx:=mousegetposx div 2; cy:=mousegetposy;
-
- {on commence le calcul de l'image en 321 = 1*320+1 :
- c'est l'ofs de la position (1,1) }
- di:=321;
- {ly va nous permettre de connaitre la composante Y de la lumière}
- ly:=1-cy;
- for i:=1 to 198 do
- begin
- {pareil pour lx}
- lx:=1-cx;
- for j:=1 to 318 do
- begin
- {On commence par calculer nx : composantes X de la normale au point}
- nx:=map^[di+1]-map^[di-1];
-
- {De la, on sait que si x et lx sont proches, le point est lumineux
- On va donc regarder la difference entre les deux, et en prendre la
- valeur absolue. On soustrait ensuite cette valeur à 128 :
- cela donnera l'intensite de la couleur}
- coul1:=127-abs(nx-lx);
-
- {De plus, il faut que la couleur soit comprise entre 0 et 128}
- if coul1<0 then coul1:=0;
-
-
- {On effectue les memes traitements sur y}
- ny:=map^[di+320]-map^[di-320];
- coul2:=127-abs(ny-ly);
- if coul2<0 then coul2:=0;
-
- {On peut maintenant combiner coul1 et coul2, avec une pauvre multiplication}
- coul:=coul1*coul2 div 64;
-
- {Et pouf, on prune la video}
- mem[$A000:di]:=coul;
- inc(di);
- {et apres chaque pixel, on incremente lx, pour indiquer que la composante
- X de la lumiere change}
- inc (lx);
- end;
- {Comme la resolution n'est que du 318*198, apres chaque ligne, on ajoute
- 2 a DI}
- di:=di+2;
- inc(ly);
- end;
-
- until mouseleft;
-
- {On repasse en mode texte}
- asm
- mov ax,3h
- int 10h
- end;
-
- End.
-